MetaTable = {}
MetaTable.get_set = {
    __newindex = function(self, key, val)
        local set = rawget(self, "__sets")[key]
        if set then
            set(self, key, val)
            return true
        end
        rawset(self, key, val)
    end,
    __index = function(self, key)
        local get = rawget(self, "__gets")[key]
        return get and get(self, key) or rawget(self, key)
    end
}